package com.nfit.shopweb.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.nfit.shopmodel.dto.system.AssginMenuDto;
import com.nfit.shopmodel.dto.system.AssginRoleDto;
import com.nfit.shopmodel.dto.system.SysRoleDto;
import com.nfit.shopmodel.entity.system.SysMenu;
import com.nfit.shopmodel.entity.system.SysRole;
import com.nfit.shopweb.mapper.SysMenuMapper;
import com.nfit.shopweb.mapper.SysRoleMapper;
import com.nfit.shopweb.mapper.SysRoleMenuMapper;
import com.nfit.shopweb.mapper.SysUserRoleMapper;
import com.nfit.shopweb.service.SysMenuService;
import com.nfit.shopweb.service.SysRoleService;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * ClassName:SysRoleServiceImpl
 * Package:com.nfit.shopweb.service.impl
 * Description
 *
 * @Author L
 * @Create 2024/11/17 13:02
 */
@Schema(description = "角色业务实现")
@Service
public class SysRoleServiceImpl implements SysRoleService {
    @Autowired
    private SysRoleMapper sysRoleMapper;

    @Autowired
    private SysUserRoleMapper sysUserRoleMapper;

    @Autowired
    private SysMenuService sysMenuService;

    @Autowired
    private SysRoleMenuMapper sysRoleMenuMapper;

    /**
     * 实现思路：把分页pageNum,pageSize 交给pageHelper管理,前端传来sysRoleDto根据条件查询,返回对应的数据
     * @param pageNum 当前页
     * @param pageSize 每页记录数
     * @param sysRoleDto 条件
     */
    @Override
    public PageInfo<SysRole> page(Integer pageNum, Integer pageSize, SysRoleDto sysRoleDto) {
        PageHelper.startPage(pageNum,pageSize);
        List<SysRole> list = sysRoleMapper.page(sysRoleDto);
        return new PageInfo<>(list);
    }

    /**
     * 实现思路：sysRole接收前端传来的数据,封装数据
     * @param sysRole 封装前端传来的数据
     */
    @Override
    public void save(SysRole sysRole) {
        sysRoleMapper.save(sysRole);
    }

    /**
     * 实现思路：把字段is_deleted = 1  表示删除
     * @param id role id
     */
    @Override
    public void delete(Long id) {
        sysRoleMapper.delete(id);
    }

    /**
     * 修改角色
     * @param sysRole 根据前端传来的数据进行修改
     */
    @Override
    public void update(SysRole sysRole) {
        sysRoleMapper.update(sysRole);
    }

    /**
     * 查询所有的角色
     * 实现思路：
     * 第一步：查询所有的角色数据,给前端进行数据回显
     * 第二步：根据用户id查询对应自身的角色id进行数据回显
     */
    @Override
    public Map<String,Object> findAll(Long userId) {
        //查询所有的角色数据
        List<SysRole> list = sysRoleMapper.findAll();
        //根据用户id查询对应自身的角色id
        List<Long> assignUserRoleIdList = sysUserRoleMapper.findByUserIdAssignRole(userId);
        Map<String,Object> map = new HashMap<>();
        //查询所有的角色数据(注意这里的名称前端也必须是这个名称)
        map.put("roleMap",list);
        //封装根据用户id查询对应自身的角色数据(注意这里的名称前端也必须是这个名称)
        map.put("assignUserRoleIdList",assignUserRoleIdList);
        return map;
    }

    /**
     * 根据角色id查询角色对应的菜单id和菜单数据,封装在map中
     */
    @Override
    public Map<String, Object> findByRoleIdAssignMenu(Long roleId) {

        //调用方法查询出所有的树形菜单
        List<SysMenu> sysMenuList = sysMenuService.menuList();
        //查询出角色id对应的所有的菜单id
        List<Long> roleMenuIdList = sysRoleMenuMapper.findByRoleIdAssignMenu(roleId);

        //创建map集合封装数据,便于后端渲染
        Map<String,Object> map = new HashMap<>();
        map.put("menuList",sysMenuList);
        map.put("roleMenuIdList",roleMenuIdList);
        //返回数据
        return map;
    }

    /**
     * 保存分配的id
     * 实现思路：
     * 第一步：根据前端转来的(assginMenuDto.roleId)角色id删除对应的菜单id
     * 第二步：遍历assginMenuDto.menuIdList获取前端传来的菜单id集合进行添加
     *
     * @param assginMenuDto 封装前端传递的菜单id
     */
    @Transactional
    @Override
    public void saveAssignMenu(AssginMenuDto assginMenuDto) {
        //获取角色id进行删除
        Long roleId = assginMenuDto.getRoleId();
        //根据角色id删除应的菜单id
        sysRoleMenuMapper.deleteByRoleId(roleId);
        //添加分配到菜单id集合
        List<Map<String, Number>> menuIdList = assginMenuDto.getMenuIdList();
        if (menuIdList.size() > 0 && menuIdList != null){
            sysRoleMenuMapper.saveAssignMenu(assginMenuDto);
        }

    }
}
